package com.example.demo.concurrent.Singleton;

import java.io.Serializable;

/**
*   饿汉模式
*   被破坏单例的情况 :
* 1.如果单例对象实现序列化接口,就有可能破坏单例对象
* 2.通过反射调用私有构造方法破坏单例
* 3.通过Unsafe破坏单例
 */
public class Singleton1 implements Serializable {
    private Singleton1() {
        if(INSTANCE !=null) {//解决反射破坏单例
            System.out.println("私有Singleton1()");
        }
    }

    /**
     * 饿汉式不会出现线程安全问题 : 因为它是被static修饰并且赋值,静态变量的赋值是在静态代码块中执行,
     * 静态代码块的线程安全问题是由JVM来保证的 --> 不需要自己考虑线程安全问题
     * 所以只要想办法把对象的创建放进静态代码块中执行那就是线程安全的
     */

    private static final Singleton1 INSTANCE = new Singleton1();

    public static Singleton1 getINSTANCE() {
        return INSTANCE;
    }
    public static void otherMethod() {
        System.out.println("otherMethod()");
    }

    //解决反序列化创建单例问题
    public Object readResolve() {
        //当反序列化的时候,就会调用这个方法返回对象,不会拿到字节数组的那个对象了-->返回同一个对象
        return INSTANCE;
    }
}